//
//  main.m
//  Block
//
//  Created by cora1n on 14-8-13.
//  Copyright (c) 2014年 devwu. All rights reserved.
//

#import <Foundation/Foundation.h>
//int * show(int a ,int b)
//{
//    int c = a*b;
//    return &c;
//    //c在该函数的作用域内有效,并且c的内存不是我们分配
//    //所以,当超出作用域时,c的这块就被系统回收
//    //c被回收后,如果再次被其他人使用时,
//}

void (*p)(int a ,int b,int *result) ;

void add(int a,int b,int* result)
{
    *result = a+b;
}
void sub(int a,int b,int* result)
{
    *result = a-b;
}
void mul(int a,int b,int* result)
{
    *result = a*b;
}
void div1(int a,int b,int* result)
{
    *result = a/b;
}

void test(void (*p)(int,int,int*),int a,int b,int *result)
{
    p(a,b,result);
}


int main(int argc, const char * argv[])
{
    //函数指针
//    int result;
//    test(add, 3, 3, &result);
//    test(div1, 4, 2, &result);
//    test(mul, 3, 5, &result);
//    test(sub, 5, 3, &result);
//    NSLog(@"%d",result);
    
    
    //函数指针的简化版本,Block(也称为闭包(closure))
    //block的出现解决了内嵌函数的操作,它的声明和使用都和函数指针类似,唯独在实现时不同
#warning 苹果将 ^ 作为Block的标志
    
    //1.声明一个Block
//    void (*pointer)(int a,int b); //函数指针
//    void (^block1)(int a,int b);
//    //2.实现一个Block
//    block1 = ^(int a,int b)
//    {
//        NSLog(@"%d+%d=%d",a,b,a+b);
//    };
//    //3.使用块;
//    block1(3,5);
    
    //需求:Block求三个数的最大值
//    void (^block2)(int a,int b,int c);
//    block2=^(int a,int b,int c)
//    {
//        if (a>b&&a>c) {
//            NSLog(@"%d",a);
//        }
//        else if (b>a && b>c) {
//            NSLog(@"%d",b);
//        }
//        else
//        {
//            NSLog(@"%d",c);
//        }
//    };
//    block2(1,20,21);

    
//    需求2:用block打印一个1 3 5 7 9 的三角形
    /**
     *      *      2*1 -1    4
     *     ***     2*2 -1    3
     *    *****    2*3 -1    2
     *   *******   2*4 -1    1
     *  *********  2*5 -1    0
     */
//    void (^printTri)()= ^
//    {
//        for (int i=0; i<5; i++)
//        {
//            for (int k=0;k<4-i;k++)
//            {
//                printf(" ");
//            }
//            for (int j=0; j<2*i+1; j++)
//            {
//                printf("*");
//            }
//            printf("\n");
//        }
//    };
//    printTri();
    
    
    //需求3: 用块实现一个浮点数的四舍五入,将结果输出
    //算法:  浮点数 + 0.5 后转为整型
//    int (^block3)(float f);
//    block3 = ^(float f)
//    {
//        int result = f+0.5;
//        return result;
//    };
//    NSLog(@"%d",block3(3.66));
//    NSLog(@"%d",block3(3.44));
//    // 标准C中的内置 四舍五入函数 round
//    NSLog(@"%d",(int)round(3.4999));
//    // floor 向下取整  ceil 向上取整
//    NSLog(@"%d,%d",(int)ceil(3.3),(int)floor(3.3));
//    //需求4: 用block实现 向上取整和向下取整操作.
//    //type 0 代表向下取整, 1代表向上取整
//    int (^block4)(float f,int type);
//    block4=^(float f,int type){
//        if (type==0)
//        {
//            int a = floor(f);
//            NSLog(@"%d",a);
//            return a;
//        }
//        else
//        {
//            int a = ceil(f);
//            NSLog(@"%d",a);
//            return a;
//        }
//    };
//    block4(3.4,0);
//    block4(3.4,1);
    
    
    
    //2.block作为函数的参数
    
    //函数声明
//    void blockDemo1(void(^block)(int a,int b));
//    
//    blockDemo1(^(int a, int b) {
//        NSLog(@"%d",a+b);
//    });
    
    
    NSArray * arr = @[@1,@3,@2];
    
    NSLog(@"%@",[arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        if ([obj1 intValue] > [obj2 intValue]) {
            return 1;
        }
        if ([obj1 intValue] < [obj2 intValue]) {
            return -1;
        }
        return 0;
    }]);
    
    
    return 0;
}
//block作为参数
void blockDemo1(void(^block)(int a,int b))
{
//    ^(int a, int b) {
//        NSLog(@"%d",a+b);
//    }
    block(3,4);
}
